uniform sampler2DRect tex0;

float getDepth(vec2 uv)
{
    float n = -1000.;
    float f =  1000.;
    float z = texture2DRect(tex0, uv).r;
//    return z;
    return (2.0 * n) / (f + n - z * (f - n));
}

void main()
{
    float gx =
        getDepth(gl_TexCoord[0].xy + vec2(-1., -1.)) +
        getDepth(gl_TexCoord[0].xy + vec2(-1.,  0.)) * 2. +
        getDepth(gl_TexCoord[0].xy + vec2(-1.,  1.)) -
        getDepth(gl_TexCoord[0].xy + vec2( 1., -1.)) -
        getDepth(gl_TexCoord[0].xy + vec2( 1.,  0.)) * 2. -
        getDepth(gl_TexCoord[0].xy + vec2( 1.,  1.));
        
    float gy =
        getDepth(gl_TexCoord[0].xy + vec2(-1., -1)) +
        getDepth(gl_TexCoord[0].xy + vec2( 0., -1)) * 2. +
        getDepth(gl_TexCoord[0].xy + vec2( 1., -1)) -
        getDepth(gl_TexCoord[0].xy + vec2(-1.,  1)) -
        getDepth(gl_TexCoord[0].xy + vec2( 0.,  1)) * 2. -
        getDepth(gl_TexCoord[0].xy + vec2( 1.,  1));

    gl_FragColor = vec4(vec3(sqrt(gx * gx + gy * gy)), 1.0);
//    gl_FragColor = vec4(vec3(getDepth(gl_TexCoord[0].xy)), 1.0);
}